上次介紹到了把 PickerView 設定好後呈現出來和累加值的部分,今天要來介紹如何把值拿來計時以及通知!
當我們按下 “Start” 的時候,原本是 PickerView 的位置要變成顯示時間的 Label ,然後一些像是 “Start” 的按鈕要改成 “Stop” 這邊我們利用了 .isHidden 來設定他們按鈕的狀態為隱藏或顯示
start_status = true
start.isHidden = true
stop.isHidden = false
pickerview.isHidden = true
label.isHidden = false
再來我們要設定顯示的時間以及格式!
我們在上一篇有講到我們是利用秒為單位,其他像是分或時的,我們直接把數字乘上去並累加起來轉換為秒的單位即可,這邊就是要把它轉回來,並分別放到對應的單位變數顯示出來即可!
let second_label = second_count % 60
let minute_label = ( second_count / 60 ) % 60
let hour_label = second_count / 3600
//轉換單位
second_count -= 1
let showHours = hour_label > 9 ? "\(hour_label)" : "0\(hour_label)"
let showMinutes = minute_label > 9 ? "\(minute_label)" : "0\(minute_label)"
let showSeconds = second_label > 9 ? "\(second_label)" : "0\(second_label)"
//如果是個位數,則前面要補零
label.text = "\(showHours):\(showMinutes):\(showSeconds)"
//把結果顯示在 Label 裡
最後我們還要寫一個函式,每秒去更動儲存秒的值以及變更 Label 的內容!
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(count_down), userInfo: nil, repeats: true) //每隔一秒去執行名叫 “count_down” 的函式
以上的程式碼都寫在 Start 的 IBAction 喔!
每秒被 Start 呼叫到之後,要每秒去更新 Label 的內容
並且要每秒去將 “second_count” -1 從而達成計算時間的方法
@objc func count_down() {
let second_label = second_count % 60
let minute_label = ( second_count / 60 ) % 60
let hour_label = second_count / 3600
let showHours = hour_label > 9 ? "\(hour_label)" : "0\(hour_label)"
let showMinutes = minute_label > 9 ? "\(minute_label)" : "0\(minute_label)"
let showSeconds = second_label > 9 ? "\(second_label)" : "0\(second_label)"
second_count -= 1 //每秒 -1
label.text = "\(showHours):\(showMinutes):\(showSeconds)"
if second_count <= -1 {
start.isEnabled = false
stop.isEnabled = false
timer.invalidate() //當時間到了會暫停 Timer 的進程
label.text = "00:00:00"
creatnotifaction() //當時間到的時候呼叫 ”creatnotifaction“ 進行系統通知的動作
}
}
當我們時間到了之後, ”count_down“ fuction 就會去呼叫這個 fuction 讓系統去建立一個 notifaction 去通知時間到了!
以下就是 notifaction 的基本設定!
func creatnotifaction() {
let content = UNMutableNotificationContent()
content.title = "Timer"
content.subtitle = "Time up"
content.body = ""
content.sound = UNNotificationSound.default
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.001, repeats: false) //0.001 秒後系統會發通知,因為不能用 0 所以我用極小值 0.001 代替
let request = UNNotificationRequest(identifier: "notification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request,withCompletionHandler: {error in print("成功建立通知...\(second_count)")
}) // 這邊如果成功建立通知的話,會 print 出 second_count 的值,可以讓我們去檢查哪裡出錯
}
按下 “Stop” 之後就是要將 “start” 的按鈕顯示出來,並把自己隱藏,還需要將 timer 暫停!
@IBAction func stop(_ sender: Any) {
start_status = false
start.isHidden = false
stop.isHidden = true
pickerview.isHidden = true
label.isHidden = false
timer.invalidate()
}
這邊我們需要把按鈕設為隱藏或顯示,還需要將上一次計算到的時間存放到 second_count,因為 pickerview 如果將畫面切回去他是不會再讀取一次值的,需要再滾動一次才會再去讀取,所以我們需要先將上次使用的值先存起來,再把 timer 暫停即可!
@IBAction func cancel(_ sender: Any) {
start_status = false
start.isHidden = false
stop.isHidden = true
pickerview.isHidden = false
label.isHidden = true
second_count = reload_count
timer.invalidate()
start.isEnabled = true
stop.isEnabled = true
}
如此一來!計時器的所有功能就設定完畢囉!